/**
 * PanelNivel.java
 */

 /**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.presentacion;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import adsec.entidades.Anio;
import adsec.entidades.Estado;
import adsec.entidades.Nivel;
import adsec.entidades.Permiso;
import adsec.entidades.Seccion;
import adsec.negocios.AdministradorSeguridad;
import adsec.negocios.ControladoraAnio;
import adsec.negocios.ControladoraNivel;
import adsec.negocios.ControladoraSeccion;
import adsec.negocios.UtilidadesCapaNegocios;
import org.jdesktop.application.Action;


public class PanelNivel extends javax.swing.JPanel implements ListSelectionListener, ChangeListener, ActionListener, ItemListener{

    private AdministradorSeguridad admSeguridad;
    private ControladoraNivel controladoraNivel;
    private ControladoraSeccion controladoraSeccion;
    private ControladoraAnio controladoraAño;
    private Permiso permisoNivelSeccion;
    private Estado estado;

    private String errorAño = "Debe ser un año válido:\n1.El campo solo permite formato númerico\n2. Verifique la cantidad de digitos, debe de ser 4 digitos";
    private String errorNivel = "Debe ser un nivel válido:\n1.El campo solo permite formato númerico";
    private String errorAñoNivel = "El campo de año y nivel deben ser completados";
    /** Creates new form PanelNivelSeccion */
    public PanelNivel() {
        initComponents();
        this.iniciarPanelNivelSeccion();
    }

    public void valueChanged(ListSelectionEvent evento) {
        int filas = ((DefaultTableModel)this.gridNiveles.getModel()).getRowCount();
        if(filas > 0 && estado.getEstadoActual() == Estado.CONSULTAR && evento.getValueIsAdjusting()){
            int fila = this.gridNiveles.getSelectedRow();
            if(fila >= 0){
                int numAño = Integer.parseInt(this.cbAño.getSelectedItem().toString());
                int numNivel = Integer.parseInt(this.gridNiveles.getModel().getValueAt(fila, 0).toString());
                this.consultarNivel(numAño, numNivel);
            }
        }
    }

    public void itemStateChanged(ItemEvent e){
        JComboBox cb =(JComboBox)e.getSource();
        boolean encontrado = false;
        if(e.getStateChange() == ItemEvent.SELECTED){
            if(cb.equals(this.cbAño)){
                this.seleccionaronAño();
                encontrado = true;
            }
            if(!encontrado && cb.equals(this.cbNivel)){
                this.seleccionaronNivel();
                encontrado = true;
            }
            if(encontrado && estado.getEstadoActual() == Estado.CONSULTAR){
                Object añoSelected = this.cbAño.getSelectedItem();
                Object nivelSelected = this.cbNivel.getSelectedItem();
                if(añoSelected != null && nivelSelected != null){
                    int numAño = Integer.parseInt(añoSelected.toString());
                    int numNivel = Integer.parseInt(nivelSelected.toString());
                    this.consultarNivel(numAño, numNivel);
                }
            }
        }
    }

    private void seleccionaronAño(){
        int index = cbAño.getSelectedIndex();
        if(index >= 0){
            if(estado.getEstadoActual() == Estado.INSERTAR){
                this.cbNivel.setEnabled(true);
            }
            this.cargarGridNiveles();
        }
    }

    private void seleccionaronNivel(){
        int index = cbNivel.getSelectedIndex();
        if(index >= 0){
            if(estado.getEstadoActual() == Estado.CONSULTAR){
                this.btnEliminar.setEnabled(this.permisoNivelSeccion.isEliminar());      
            }
        }
    }

    public void stateChanged(ChangeEvent e){
        if(estado.getEstadoActual() != Estado.CONSULTAR){
            int cantidad = Integer.parseInt(spinCantidadSecciones.getModel().getValue().toString());
            if(cantidad > 0){
                spinCupoMaximo.setEnabled(true);
                spinCupoMaximo.setValue(25);
            }else{
                spinCupoMaximo.setEnabled(false);
                spinCupoMaximo.setValue(1);
            }
        }
    }

   public void actionPerformed(ActionEvent e){
        if(estado.getEstadoActual() == Estado.INSERTAR){
            JComboBox cb =(JComboBox)e.getSource();
            boolean encontrado = false;
            if(e.getActionCommand().equals("comboBoxEdited")){
                if(cb.equals(this.cbAño)){
                    this.accionAñoEditado();
                    encontrado = true;
                }
                if(!encontrado && cb.equals(this.cbNivel)){
                    this.accionNivelEditado();
                    encontrado = true;
                }
            }
        }
    }

    public void accionAñoEditado(){
        Object añoSelected = this.cbAño.getSelectedItem();
        if(añoSelected != null){
            String seleccion = this.cbAño.getSelectedItem().toString();
            if(!isNumber(seleccion) || seleccion.length() != 4 ){
                this.cbNivel.setEnabled(false);
                this.cbAño.setSelectedItem("");
                this.cbAño.setSelectedIndex(-1);
                JOptionPane.showMessageDialog(null, errorAño, "ERROR", JOptionPane.ERROR_MESSAGE);
            }else{
                this.cbNivel.setEnabled(true);
            }
        }
    }//fin accionAñoEditado

    public void accionNivelEditado(){
        Object nivelSelected = this.cbNivel.getSelectedItem();
        if(nivelSelected != null){
            String seleccion = this.cbNivel.getSelectedItem().toString();
            if(!isNumber(seleccion) || seleccion.trim().isEmpty() ){
                this.cbNivel.setSelectedItem("");
                this.cbNivel.setSelectedIndex(-1);
                JOptionPane.showMessageDialog(null, errorNivel, "ERROR", JOptionPane.ERROR_MESSAGE);
            }
        }
    }//fin accionNivelEditado

    public boolean isNumber(String numero){
        boolean resultado = true;
        int numeroEntero = 0;
        try{
            numeroEntero = Integer.parseInt(numero);
        }catch(NumberFormatException excepcion){
            resultado = false;
        }
        return resultado;
    }
    
    private void iniciarPanelNivelSeccion(){
        this.admSeguridad = AdministradorSeguridad.getInstancia();
        this.controladoraNivel = new ControladoraNivel();
        this.controladoraSeccion = new ControladoraSeccion();
        this.controladoraAño = new ControladoraAnio();
        this.permisoNivelSeccion = this.admSeguridad.getPermiso(UtilidadesCapaNegocios.moduloNiveles);
        this.estado = new Estado();
        this.limpiarCampos();
        this.habilitarCampos(false);
        this.habilitarBotonesIME(this.permisoNivelSeccion.isInsertar(), false);
        this.habilitarAceptarCancelar(false);
        this.cargarAños();
        this.cargarNiveles();
        this.cbAño.setSelectedIndex(-1);
        this.cbNivel.setSelectedIndex(-1);
    }

    private void habilitarBotonesIME(boolean insertar, boolean eliminar){
        this.btnInsertar.setEnabled(insertar);
        this.btnEliminar.setEnabled(eliminar);
    }

    private void habilitarAceptarCancelar(boolean habilitar){
        this.btnAceptar.setEnabled(habilitar);
        this.btnCancelar.setEnabled(habilitar);
    }

    private void limpiarCampos(){
        this.cbNivel.setSelectedIndex(-1);
        this.cbAño.setSelectedIndex(-1);
        this.spinCantidadSecciones.getModel().setValue(0);
        this.spinCupoMaximo.getModel().setValue(1);
    }

    private void habilitarCampos(boolean habilitar){
        this.cbAño.setEditable(habilitar);
        this.cbNivel.setEditable(habilitar);
        this.spinCantidadSecciones.setEnabled(habilitar);
    }

    private void cargarAños(){
        cbAño.removeItemListener(this);
        ((DefaultComboBoxModel)cbAño.getModel()).removeAllElements();
        LinkedList<Anio> años = this.controladoraAño.consultarAnios();
        Iterator<Anio> iterador = años.iterator();
        while(iterador.hasNext()){
            String elemento = iterador.next().toString();
            ((DefaultComboBoxModel)this.cbAño.getModel()).addElement(elemento);
        }
        cbAño.addItemListener(this);
    }

    private void cargarNiveles(){
        cbNivel.removeItemListener(this);
        ((DefaultComboBoxModel)cbNivel.getModel()).removeAllElements();
        LinkedList<Nivel> niveles = this.controladoraNivel.consultarNivelesTodos();
        Iterator<Nivel> iterador = niveles.iterator();
        while(iterador.hasNext()){
            String elemento = Integer.toString(iterador.next().getNivel());
            ((DefaultComboBoxModel)this.cbNivel.getModel()).addElement(elemento);
        }
        cbNivel.addItemListener(this);
    }

    private void cargarGridNiveles(){
        this.limpiarGridNiveles();
        Anio año = new Anio();
        int añio = Integer.parseInt(cbAño.getSelectedItem().toString());
        año.setAnio(añio);
        LinkedList<Nivel> niveles= controladoraNivel.consultarNiveles(año);
        Iterator<Nivel> iterador = niveles.iterator();
        while(iterador.hasNext()){
            Nivel nivel = iterador.next();
            Object arregloDatos[] = new Object[2];
            if(nivel.getNivel() > 0){
                arregloDatos[0] = nivel.getNivel();
                arregloDatos[1] = nivel.getCantidadSecciones();
                ((DefaultTableModel)this.gridNiveles.getModel()).addRow(arregloDatos);
            }
        }
    }

    private void limpiarGridNiveles(){
        ((DefaultTableModel)this.gridNiveles.getModel()).setRowCount(0);
    }

    private void insertarNivel(){
        Nivel nivel = new Nivel();
        nivel.setNivel(Integer.parseInt(cbNivel.getSelectedItem().toString()));
        int cantidadSecciones = Integer.parseInt(this.spinCantidadSecciones.getValue().toString());
        int resultadoNivel = UtilidadesCapaNegocios.QUERY_OK;
        if(!UtilidadesCapaNegocios.existeLlave(Nivel.nombreTabla, Nivel.nivelNC, Integer.toString(nivel.getNivel()) )){
            resultadoNivel = controladoraNivel.insertarNivel(nivel);
        }
        Anio año = new Anio();
        int resultadoAño = UtilidadesCapaNegocios.QUERY_OK;
        int añoSeleccionado = Integer.parseInt(cbAño.getSelectedItem().toString());
        año.setAnio(añoSeleccionado);
        if(!UtilidadesCapaNegocios.existeLlave(Anio.nombreTabla, Anio.anioNC, Integer.toString(año.getAnio()))){
            resultadoAño = this.controladoraAño.insertarAnio(año);
        }
        int resultadoSeccion = UtilidadesCapaNegocios.QUERY_OK;
        if(cantidadSecciones > 0){
            for(int sec = 1; sec <= cantidadSecciones; sec++){
                Seccion seccion = new Seccion();
                seccion.setNivel(nivel.getNivel());
                seccion.setAnio(año.getAnio());
                int cupo = Integer.parseInt(spinCupoMaximo.getValue().toString());
                seccion.setCupoMaximo(cupo);
                resultadoSeccion = controladoraSeccion.insertarSeccionNiveles(seccion);
            }
        }
        boolean resultado = resultadoNivel == UtilidadesCapaNegocios.QUERY_OK;
        resultado &= resultadoAño == UtilidadesCapaNegocios.QUERY_OK;
        resultado &= resultadoSeccion == UtilidadesCapaNegocios.QUERY_OK;
        if(resultado){
            JOptionPane.showMessageDialog(null, "El nivel fue insertado exitosamente");
            this.volverConsultar();
        }else{
            String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloNiveles, UtilidadesCapaNegocios.opModificar);
            JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
        }
    }//fin de insertarNivel


    private void eliminarNivel(){
        Object nivelSelected = cbNivel.getSelectedItem();
        if(nivelSelected != null){
            int numeroNivel = Integer.parseInt(nivelSelected.toString());
            Nivel nivel = new Nivel();
            nivel.setNivel(numeroNivel);
            if(this.comprobarBorrarNivel(nivel)){
                int resultado = this.controladoraNivel.eliminarNivel(nivel);
                if(resultado == UtilidadesCapaNegocios.QUERY_OK){
                    this.cbAño.setSelectedIndex(-1);
                    JOptionPane.showMessageDialog(null, "El nivel fue eliminado exitosamente");
                    this.volverConsultar();
                    this.limpiarCampos();
                }else{
                    String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloNiveles, UtilidadesCapaNegocios.opEliminar);
                    JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
    }

    private boolean comprobarBorrarNivel(Nivel nivel){
        boolean resultado = true;
        String mensaje = "";
        if(controladoraNivel.nivelTieneSecciones(nivel)){
            mensaje += "El nivel tiene secciones asociadas no puede borrarlo, debe borrar las secciones antes.\n";
            resultado = false;
        }
        if(controladoraNivel.nivelTieneMaterias(nivel)){
            mensaje+= "El nivel tiene materias asociadas no puede borrarlo, debe borrar las materias antes.";
            resultado = false;
        }
        if(!resultado){
            JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
        }
        return resultado;
    }

    private void consultarNivel(int numAño, int numNivel){
        Anio año = new Anio();
        año.setAnio(numAño);
        Nivel nivelConsultar = new Nivel();
        nivelConsultar.setNivel(numNivel);
        Nivel nivel = this.controladoraNivel.consultarNivel(año, nivelConsultar);
        this.spinCantidadSecciones.setValue(nivel.getCantidadSecciones());
        this.cbAño.setSelectedItem(año.toString());
        this.cbNivel.setSelectedItem(Integer.toString(numNivel));
    }

    private void volverConsultar(){
        this.estado.setEstadoActual(Estado.CONSULTAR);
        this.habilitarBotonesIME(permisoNivelSeccion.isInsertar(), false);
        this.limpiarGridNiveles();
        this.habilitarCampos(false);
        this.cbAño.setEnabled(true);
        this.cbNivel.setEnabled(true);
        this.habilitarAceptarCancelar(false);
        Object añoSelected = cbAño.getSelectedItem();
        Object nivelSelected = cbNivel.getSelectedItem();
        if(añoSelected != null && nivelSelected != null ){
            this.cargarAños();
            this.cargarNiveles();
            cbAño.setSelectedItem(añoSelected.toString());
            cbNivel.setSelectedItem(nivelSelected.toString());
            this.cargarGridNiveles();
        }
    }

    @Action
    public void insertandoNivel() {
        this.estado.setEstadoActual(Estado.INSERTAR);
        this.limpiarCampos();
        this.limpiarGridNiveles();
        this.habilitarBotonesIME(false, false);
        this.habilitarAceptarCancelar(true);
        this.habilitarCampos(true);
        this.cbNivel.setEnabled(false);
    }
    
    @Action
    public void eliminandoNivel() {
        Animador.animar();
        if(this.mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opEliminar, "ELIMINAR")){
            this.eliminarNivel();
        }
        Animador.detenerAnimacion();
    }
    /**
     ** Muestra un mensaje de confirmación para que el usuario decida si realmente
     ** quiere llevar a cabo una operación
     ** @param operacion Código de operación realizada, tomada de UtilidadesCapaNegocios
     ** @param titulo Título a mostrar en el cuadro de confirmación
     ** @return Confirmación: true si el usuario acepta, false en otro caso.
     **/
    private boolean mostrarMensajeConfirmacion(int operacion,String titulo){
        boolean resultado = true;
        String mensaje = UtilidadesCapaNegocios.getMensajeConfirmacion(UtilidadesCapaNegocios.moduloNiveles, operacion);
        int respuesta = JOptionPane.showConfirmDialog(null, mensaje,titulo ,JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE);
        resultado = respuesta == JOptionPane.OK_OPTION;
        return resultado;
    }//fin de mostrarMensajeConfirmacion

    private boolean verificarDatosObligatorios(){
        boolean resultado = true;
        Object seleccionAño = cbAño.getSelectedItem();
        Object seleccionNivel = cbNivel.getSelectedItem();
        resultado &= seleccionAño != null && seleccionNivel != null;
        return resultado;
    }

    @Action
    public void accionAceptar() {
        Animador.animar();
        switch(estado.getEstadoActual()){
            case Estado.INSERTAR:
                if(this.mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opInsertar, "INSERTAR")){
                    if(verificarDatosObligatorios()){
                        this.insertarNivel();
                    }else{
                        JOptionPane.showMessageDialog(null, errorAñoNivel, "ERROR", JOptionPane.ERROR_MESSAGE);
                    }
                }
            break;
        }
        Animador.detenerAnimacion();
    }

    @Action
    public void accionCancelar() {
        this.limpiarCampos();
        this.volverConsultar();
    }


    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        btnInsertar = new javax.swing.JButton();
        btnEliminar = new javax.swing.JButton();
        cbAño = new javax.swing.JComboBox();
        lbAñoNivel = new javax.swing.JLabel();
        lbNivel = new javax.swing.JLabel();
        lbCantidadSecciones = new javax.swing.JLabel();
        spinCantidadSecciones = new javax.swing.JSpinner(new SpinnerNumberModel(0,0,100,1));
        lbCupoMaximo = new javax.swing.JLabel();
        spinCupoMaximo = new javax.swing.JSpinner(new SpinnerNumberModel(1,1,100,1));
        scrollGridNiveles = new javax.swing.JScrollPane();
        gridNiveles = new javax.swing.JTable();
        btnAceptar = new javax.swing.JButton();
        btnCancelar = new javax.swing.JButton();
        cbNivel = new javax.swing.JComboBox();
        obli1 = new javax.swing.JLabel();
        obli2 = new javax.swing.JLabel();

        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(adsec.presentacion.LiceoEscazuApp.class).getContext().getResourceMap(PanelNivel.class);
        setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("Form.border.title"))); // NOI18N
        setMinimumSize(new java.awt.Dimension(660, 305));
        setName("Form"); // NOI18N
        setPreferredSize(new java.awt.Dimension(660, 305));

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(adsec.presentacion.LiceoEscazuApp.class).getContext().getActionMap(PanelNivel.class, this);
        btnInsertar.setAction(actionMap.get("insertandoNivel")); // NOI18N
        btnInsertar.setText(resourceMap.getString("btnInsertar.text")); // NOI18N
        btnInsertar.setName("btnInsertar"); // NOI18N

        btnEliminar.setAction(actionMap.get("eliminandoNivel")); // NOI18N
        btnEliminar.setText(resourceMap.getString("btnEliminar.text")); // NOI18N
        btnEliminar.setName("btnEliminar"); // NOI18N

        cbAño.setName("cbAño"); // NOI18N

        lbAñoNivel.setText(resourceMap.getString("lbAñoNivel.text")); // NOI18N
        lbAñoNivel.setName("lbAñoNivel"); // NOI18N

        lbNivel.setText(resourceMap.getString("lbNivel.text")); // NOI18N
        lbNivel.setName("lbNivel"); // NOI18N

        lbCantidadSecciones.setText(resourceMap.getString("lbCantidadSecciones.text")); // NOI18N
        lbCantidadSecciones.setName("lbCantidadSecciones"); // NOI18N

        spinCantidadSecciones.setEnabled(false);
        spinCantidadSecciones.setName("spinCantidadSecciones"); // NOI18N

        lbCupoMaximo.setText(resourceMap.getString("lbCupoMaximo.text")); // NOI18N
        lbCupoMaximo.setName("lbCupoMaximo"); // NOI18N

        spinCupoMaximo.setEnabled(false);
        spinCupoMaximo.setName("spinCupoMaximo"); // NOI18N

        scrollGridNiveles.setName("scrollGridNiveles"); // NOI18N

        gridNiveles.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Nivel", "Cantidad Secciones"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        gridNiveles.setName("gridNiveles"); // NOI18N
        scrollGridNiveles.setViewportView(gridNiveles);
        gridNiveles.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        gridNiveles.getSelectionModel().addListSelectionListener(this);

        btnAceptar.setAction(actionMap.get("accionAceptar")); // NOI18N
        btnAceptar.setText(resourceMap.getString("btnAceptar.text")); // NOI18N
        btnAceptar.setName("btnAceptar"); // NOI18N

        btnCancelar.setAction(actionMap.get("accionCancelar")); // NOI18N
        btnCancelar.setText(resourceMap.getString("btnCancelar.text")); // NOI18N
        btnCancelar.setName("btnCancelar"); // NOI18N

        cbNivel.setName("cbNivel"); // NOI18N

        obli1.setForeground(resourceMap.getColor("obli1.foreground")); // NOI18N
        obli1.setText(resourceMap.getString("obli1.text")); // NOI18N
        obli1.setName("obli1"); // NOI18N

        obli2.setForeground(resourceMap.getColor("obli2.foreground")); // NOI18N
        obli2.setText(resourceMap.getString("obli2.text")); // NOI18N
        obli2.setName("obli2"); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                        .addGroup(layout.createSequentialGroup()
                            .addContainerGap()
                            .addComponent(scrollGridNiveles, javax.swing.GroupLayout.DEFAULT_SIZE, 626, Short.MAX_VALUE))
                        .addGroup(layout.createSequentialGroup()
                            .addGap(118, 118, 118)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                    .addComponent(btnAceptar)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(btnCancelar))
                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                    .addComponent(btnInsertar)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(btnEliminar)))))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(lbAñoNivel, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(lbNivel, javax.swing.GroupLayout.Alignment.TRAILING))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(cbAño, javax.swing.GroupLayout.Alignment.TRAILING, 0, 73, Short.MAX_VALUE)
                            .addComponent(cbNivel, javax.swing.GroupLayout.Alignment.TRAILING, 0, 0, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(obli2)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(lbCantidadSecciones)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(spinCantidadSecciones, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(12, 12, 12)
                                .addComponent(lbCupoMaximo)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(spinCupoMaximo, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(obli1))
                        .addGap(171, 171, 171)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(btnEliminar)
                            .addComponent(btnInsertar))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                            .addComponent(lbAñoNivel)
                            .addComponent(cbAño, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                            .addComponent(lbNivel)
                            .addComponent(cbNivel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(obli2)
                            .addComponent(lbCantidadSecciones)
                            .addComponent(spinCantidadSecciones, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lbCupoMaximo)
                            .addComponent(spinCupoMaximo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(23, 23, 23)
                        .addComponent(scrollGridNiveles, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(btnCancelar)
                            .addComponent(btnAceptar)))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(48, 48, 48)
                        .addComponent(obli1)))
                .addContainerGap(13, Short.MAX_VALUE))
        );

        cbAño.addActionListener(this);
        spinCantidadSecciones.addChangeListener(this);
        cbNivel.addActionListener(this);
    }// </editor-fold>//GEN-END:initComponents


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAceptar;
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnEliminar;
    private javax.swing.JButton btnInsertar;
    private javax.swing.JComboBox cbAño;
    private javax.swing.JComboBox cbNivel;
    private javax.swing.JTable gridNiveles;
    private javax.swing.JLabel lbAñoNivel;
    private javax.swing.JLabel lbCantidadSecciones;
    private javax.swing.JLabel lbCupoMaximo;
    private javax.swing.JLabel lbNivel;
    private javax.swing.JLabel obli1;
    private javax.swing.JLabel obli2;
    private javax.swing.JScrollPane scrollGridNiveles;
    private javax.swing.JSpinner spinCantidadSecciones;
    private javax.swing.JSpinner spinCupoMaximo;
    // End of variables declaration//GEN-END:variables

}
